Web uygulamalarınızda dayanıklı, sürdürülebilir indirmeler oluşturun. Bu rehber ağ kesintilerinde bile büyük dosyaları Background Fetch API ile aktarmayı gösterir.
Ön Uç (Frontend) Background Fetch Uzmanlığı: Dayanıklı ve Sürdürülebilir İndirmeler Oluşturma
Giderek daha bağlantılı hale gelen dünyamızda web, artık sadece statik belgelerin olduğu bir yer değil. Yüksek çözünürlüklü video içeriklerinden karmaşık iş yazılımlarına ve sürükleyici oyunlara kadar her şeyi sunan zengin, etkileşimli uygulamalar için bir platform. Bu evrim, dünya genelindeki geliştiricilerin yüzleşmesi gereken önemli bir zorluğu da beraberinde getiriyor: çoğu zaman güvenilir olmaktan uzak ağlar üzerinden büyük dosyaların güvenilir bir şekilde aktarılması. Seul'de banliyö trenindeki bir kullanıcı, Güney Amerika'nın kırsal bir kesimindeki bir öğrenci veya Dubai'de zayıf bir otel Wi-Fi bağlantısı olan bir profesyonel olsun, kopan bir bağlantı başarısız bir indirme, hayal kırıklığına uğramış bir kullanıcı ve bozuk bir deneyim anlamına gelebilir. İşte bu noktada Background Fetch API, oyunun kurallarını değiştiren bir çözüm olarak ortaya çıkıyor.
`fetch()` veya `XMLHttpRequest` gibi geleneksel yöntemler güçlüdür, ancak doğaları gereği bir web sayfasının yaşam döngüsüne bağlıdırlar. Bir kullanıcı sekmeyi kapatırsa veya başka bir sayfaya giderse, indirme işlemi sonlandırılır. Sayfanın oturumundan sonra hayatta kalması için yerleşik bir mekanizma yoktur. Background Fetch API, bu paradigmayı temelden değiştirir. Bir web uygulamasının büyük indirme (ve yükleme) görevlerini tarayıcının kendisine devretmesine olanak tanır. Tarayıcı daha sonra bu aktarımı, herhangi bir tarayıcı sekmesinden bağımsız olarak arka planda yönetir. Bu, kullanıcı sayfayı kapatsa bile indirmelerin devam edebileceği ve daha da önemlisi, ağ bağlantısı değiştiğinde otomatik olarak duraklatılıp sürdürülebileceği anlamına gelir. Bu, web'de gerçekten dayanıklı, yerel uygulama benzeri indirme deneyimleri oluşturmanın anahtarıdır.
Background Fetch API Nedir? Küresel Bir Bakış Açısı
Özünde, Background Fetch API, büyük ağ isteklerini tarayıcının motoruna devretmek için tasarlanmış modern bir web standardıdır. Geliştiricilere, uygulamanın görünür penceresinin ömrünün ötesinde devam eden indirmeler veya yüklemeler başlatma gücü verir. Bu sadece küçük bir kolaylık değil; daha sağlam ve yetenekli bir web için temel bir teknolojidir.
Etkisini küresel bir açıdan düşünün. Dünyanın birçok yerinde, yüksek hızlı, istikrarlı internet bir lüks, bir zorunluluk değil. Mobil veri pahalı ve kotalı olabilir. Bir uygulamanın gerçekten küresel olabilmesi için bu çeşitli ağ koşullarını dikkate alması gerekir. Background Fetch, eşitlik sağlayan bir teknolojidir. Kesintili bağlantıya sahip bir bölgedeki kullanıcının bir eğitim videosu veya kritik bir yazılım güncellemesi için indirme başlatmasına, bağlantısı izin verdikçe arka planda tamamlanacağına güvenmesine ve başarısız dosyaları yeniden indirerek değerli verileri boşa harcamamasına olanak tanır.
Background Fetch'in Temel Faydaları
- Dayanıklılık ve Sürdürme: Bu, en dikkat çeken özelliktir. Tarayıcının temel indirme yöneticisi, ağ kesintilerini zarif bir şekilde yönetir. Bağlantı kesilirse, indirme duraklatılır. Bağlantı yeniden kurulduğunda, kaldığı yerden otomatik olarak devam eder. Bu, HTTP `Range` başlıklarını işlemek için karmaşık JavaScript mantığına gerek kalmadan gerçekleşir.
- Çevrimdışı Kalıcılık: İndirme, tarayıcı işlemi tarafından yönetildiği ve bir Service Worker tarafından işlendiği için açık bir sekmeye bağlı değildir. Bir kullanıcı bir indirme başlatabilir, dizüstü bilgisayarını kapatabilir, eve gidip tekrar açabilir ve indirmenin tamamlandığını veya ilerlediğini görebilir.
- Kaynak Verimliliği: Tarayıcı, kaynak kullanımını optimize etmek için en iyi konumdadır. Aktarımları Wi-Fi bağlantılarından yararlanacak şekilde planlayabilir, mobil veriden tasarruf edebilir ve pil ömrünü optimize etmek için işlemleri yönetebilir ki bu, dünyanın her yerindeki mobil kullanıcılar için kritik bir endişedir.
- Entegre Kullanıcı Deneyimi: Tarayıcı, devam eden indirmeler için yerel, sistem düzeyinde bir kullanıcı arayüzü sağlayabilir. Kullanıcılar bu web indirmelerini, yerel uygulamalardan yapılan indirmeleri yönettikleri yerde görür ve yönetir, bu da sorunsuz ve tanıdık bir deneyim yaratır. Bu, ilerleme, tamamlama ve başarısızlık için bildirimleri içerir.
Temel Bileşenler: Service Worker'lar ve BackgroundFetchManager
Background Fetch'i anlamak için önce iki ana bileşenine aşina olmalısınız. Bunlar birlikte çalışır: biri web sayfasından isteği başlatır, diğeri ise sonucu arka planda yönetir.
Adsız Kahraman: Service Worker
Bir Service Worker, bir tür Web Worker'dır; esasen tarayıcınızın herhangi bir web sayfasından tamamen ayrı olarak arka planda çalıştırdığı bir JavaScript betiğidir. Programlanabilir bir ağ proxy'si olarak hareket eder, ağ isteklerini yakalar ve işler, önbelleği yönetir ve anlık bildirimleri etkinleştirir. Bağımsız çalıştığı için, web siteniz bir tarayıcı sekmesinde açık olmasa bile görevleri yerine getirebilir. Background Fetch için Service Worker, indirmenin nihai başarısını veya başarısızlığını dinleyen, sonuçta ortaya çıkan dosyaları işleyen ve kullanıcı arayüzünü güncelleyen veya varlıkları çevrimdışı kullanım için önbelleğe alan kalıcı ortamdır.
Orkestra Şefi: BackgroundFetchManager
`BackgroundFetchManager`, ana web sayfanızın JavaScript'inden erişilebilen, bir arka plan getirme işlemi başlatmak ve yapılandırmak için kullandığınız arayüzdür. Ona Service Worker kayıt nesnesi aracılığıyla erişirsiniz: `navigator.serviceWorker.ready.then(swReg => swReg.backgroundFetch)`. Ana yöntemi, bir kimlik, indirilecek dosyaların bir listesi ve bir dizi seçenek alan `fetch()` yöntemidir. Bu yöntem başlangıç tetiğidir; onu çağırdığınızda tarayıcı kontrolü devralır ve Service Worker'ınız bitiş çizgisinde bekler.
Adım Adım Pratik Uygulama Rehberi
Büyük bir video dosyası için sürdürülebilir bir indirme işlemini nasıl uygulayacağımızı adım adım inceleyelim. Bu örnek, Amerika Birleşik Devletleri'ndeki bir medya platformu, Hindistan'daki bir e-öğrenme sitesi veya Almanya'daki bir kurumsal eğitim portalı için evrensel olarak uygulanabilir.
Adım 1: Tarayıcı Desteğini Kontrol Etme
Başka bir şey yapmadan önce, kullanıcının tarayıcısının Background Fetch API'sini desteklediğinden emin olmalısınız. Aşamalı geliştirme olarak bilinen bu uygulama, en gelişmiş özelliklere sahip olmasalar bile herkes için işlevsel bir deneyim sağlar.
Ana uygulama betiğinizde, `BackgroundFetchManager`'ın varlığını kontrol edersiniz:
if ('BackgroundFetchManager' in self) { // API destekleniyor, geliştirilmiş indirme düğmesini gösterebiliriz } else { // API desteklenmiyor, bir yedek çözüm sunun (ör. standart bir bağlantı) }
Adım 2: Bir Service Worker Kaydetme
Background Fetch temel olarak bir Service Worker'a bağlıdır. Progresif Web Uygulamanız (PWA) için zaten bir tane yoksa, bir tane oluşturup kaydetmeniz gerekir. Projenizin kök dizininde `service-worker.js` adında bir dosya oluşturun. Ardından, ana JavaScript dosyanızdan kaydedin:
async function registerServiceWorker() { if ('serviceWorker' in navigator) { try { const registration = await navigator.serviceWorker.register('/service-worker.js'); console.log('Service Worker başarıyla kaydedildi:', registration); } catch (error) { console.error('Service Worker kaydı başarısız oldu:', error); } } } registerServiceWorker();
Adım 3: Ön Uçtan (Frontend) Bir Background Fetch Başlatma
Şimdi, bir kullanıcı bir düğmeye tıkladığında indirmeyi başlatan işlevi oluşturalım. Bu işlev, aktif Service Worker kaydını alacak ve ardından `backgroundFetch.fetch()`'i çağıracaktır.
const downloadVideoButton = document.getElementById('download-video-btn'); downloadVideoButton.addEventListener('click', async () => { try { // Service Worker kaydını al const swReg = await navigator.serviceWorker.ready; // İndirme ayrıntılarını tanımla const videoUrl = '/assets/large-course-video.mp4'; const videoFileSize = 250 * 1024 * 1024; // 250 MB // Arka plan getirme işlemini başlat const bgFetch = await swReg.backgroundFetch.fetch('course-video-download-01', [videoUrl], { title: 'Modül 1: Web Geliştirmeye Giriş', icons: [{ sizes: '192x192', src: '/images/icons/icon-192.png', type: 'image/png', }], downloadTotal: videoFileSize, } ); console.log('Background Fetch başlatıldı:', bgFetch); } catch (error) { console.error('Background Fetch başlatılamadı:', error); } });
`swReg.backgroundFetch.fetch()` parametrelerini inceleyelim:
- ID (`'course-video-download-01'`): Bu özel indirme işi için benzersiz bir dize tanımlayıcı. Bu ID'yi daha sonra işe referans vermek için kullanacaksınız.
- İstekler (`[videoUrl]`): Getirilecek URL'lerin bir dizisi. Tek bir gruplandırılmış işte birden fazla dosya indirebilirsiniz.
- Seçenekler (`{...}`): İndirmeyi yapılandırmak için bir nesne. `title` ve `icons`, tarayıcı tarafından yerel kullanıcı arayüzü bildirimini oluşturmak için kullanılır. `downloadTotal`, birleştirilmiş tüm dosyaların bayt cinsinden beklenen toplam boyutudur; bunu sağlamak, tarayıcının doğru bir ilerleme çubuğu göstermesi için çok önemlidir.
Adım 4: Service Worker'da Olayları Yönetme
İndirme tarayıcıya devredildikten sonra, ön uç kodunuzun işi şimdilik bitti. Mantığın geri kalanı, iş tamamlandığında veya başarısız olduğunda tarayıcı tarafından uyandırılacak olan `service-worker.js` dosyasında bulunur.
İki ana olayı dinlemeniz gerekir: `backgroundfetchsuccess` ve `backgroundfetchfail`.
// service-worker.js içinde self.addEventListener('backgroundfetchsuccess', (event) => { const bgFetch = event.registration; event.waitUntil(async function () { console.log(`'${bgFetch.id}' arka plan getirme işlemi başarıyla tamamlandı.`); // İndirilen dosyalarımızı saklayacağımız önbelleği aç const cache = await caches.open('downloaded-assets-v1'); // Tüm indirilen dosya kayıtlarını al const records = await bgFetch.matchAll(); // Her kayıt için yanıtı önbellekte sakla const promises = records.map(async (record) => { const response = record.response.clone(); await cache.put(record.request, response); }); await Promise.all(promises); // İsteğe bağlı: İndirme bildirimindeki kullanıcı arayüzü başlığını güncelle await event.updateUI({ title: 'İndirme tamamlandı ve hazır!' }); }()); }); self.addEventListener('backgroundfetchfail', (event) => { const bgFetch = event.registration; console.error(`'${bgFetch.id}' arka plan getirme işlemi başarısız oldu.`); // İsteğe bağlı: Başarısızlığı yansıtmak için kullanıcı arayüzünü güncelle event.updateUI({ title: 'İndirme başarısız oldu. Lütfen tekrar deneyin.' }); });
Başarı işleyicisinde, Cache Storage'ı açarız, `bgFetch.matchAll()` kullanarak indirilen tüm dosyaları alırız ve ardından her birini önbelleğe koyarız. Bu, videoyu web uygulamanız tarafından çevrimdışı oynatım için kullanılabilir hale getirir.
Adım 5: İlerlemeyi İzleme ve Kullanıcı Etkileşimi
Harika bir kullanıcı deneyimi geri bildirim sağlamayı içerir. Kullanıcı tarayıcı tarafından sağlanan indirme bildirimine tıkladığında, onları uygulamamızda ilgili bir sayfaya yönlendirmeliyiz. Bunu Service Worker'daki `backgroundfetchclick` olayı ile yönetiriz.
// service-worker.js içinde self.addEventListener('backgroundfetchclick', (event) => { const bgFetch = event.registration; if (bgFetch.id === 'course-video-download-01') { event.waitUntil( clients.openWindow('/downloads') ); } });
Bu kod, tarayıcıya, kullanıcı bu belirli indirme işi için bildirime tıkladığında web sitenizin `/downloads` sayfasını açmasını söyler. O sayfada, indirme ilerlemesini veya tamamlanmış indirmelerin bir listesini görüntüleyebilirsiniz.
Sürdürme Sihri: Aslında Nasıl Çalışır?
Background Fetch'in en güçlü ve belki de en yanlış anlaşılan yönü, otomatik sürdürme yeteneğidir. Bunun için herhangi bir özel kod yazmanıza gerek kalmadan nasıl çalışır?
Cevap, sorumluluğu son derece optimize edilmiş, sistem düzeyinde bir sürece devretmiş olmanızdır: tarayıcının kendi indirme yöneticisi. Bir arka plan getirme işlemi başlattığınızda, ağ üzerinden baytları doğrudan yönetmiyorsunuz. Tarayıcı yönetiyor.
Bir ağ kesintisi sırasındaki olaylar dizisi şöyledir:
- Kullanıcı bir dosya indiriyor ve cihazının ağ bağlantısı kesiliyor (örneğin, bir tünele giriyorlar).
- Tarayıcının indirme yöneticisi ağ hatasını algılar ve aktarımı zarif bir şekilde duraklatır. Başarıyla alınan bayt sayısını takip eder.
- Kullanıcının cihazı daha sonra tekrar ağ bağlantısı kazanır.
- Tarayıcı otomatik olarak indirmeyi sürdürmeye çalışır. Sunucuya aynı dosya için yeni bir HTTP isteği gönderir, ancak bu sefer bir `Range` başlığı ekler ve etkili bir şekilde sunucuya, "Ben zaten ilk 'X' bayta sahibim, lütfen bana geri kalanını 'X+1' baytından başlayarak gönder" der.
- Doğru yapılandırılmış bir sunucu, `206 Partial Content` durumuyla yanıt verir ve dosyanın geri kalanını akışla göndermeye başlar.
- Tarayıcı, bu yeni veriyi kısmen indirilmiş dosyaya ekler.
Bu sürecin tamamı JavaScript kodunuz için şeffaftır. Service Worker'ınız yalnızca en sonunda, dosya tamamen indirilip başarıyla bir araya getirildiğinde veya işlem kalıcı olarak başarısız olursa (örneğin, dosya artık sunucuda değilse) bilgilendirilir. Bu soyutlama inanılmaz derecede güçlüdür ve geliştiricileri karmaşık ve kırılgan indirme sürdürme mantığı oluşturmaktan kurtarır.
Küresel Kitle için İleri Düzey Kavramlar ve En İyi Uygulamalar
Doğru Bir `downloadTotal` Sağlama
`downloadTotal` seçeneği, sadece olması güzel bir özellikten daha fazlasıdır. O olmadan, tarayıcı yalnızca belirsiz bir ilerleme göstergesi (ör. dönen bir simge) gösterebilir. Onunla birlikte ise, kesin bir ilerleme çubuğu görüntüleyebilir ve kalan tahmini süreyi hesaplayabilir. Bu, kullanıcı deneyimini önemli ölçüde iyileştirir. Bu değeri elde etmek için, `Content-Length` başlığını kontrol etmek amacıyla dosyanın URL'sine önceden bir `HEAD` isteği yapmanız gerekebilir veya API'niz dosya boyutlarını meta verilerinin bir parçası olarak sağlayabilir.
Tek Bir Getirme İşleminde Birden Fazla Dosyayı Yönetme
API, ilgili varlıkları gruplarken parlar. Bir fotoğraf galerisi, belgeleriyle birlikte bir yazılım paketi veya tüm dokuları ve ses dosyalarıyla birlikte bir video oyunu seviyesi indiren bir kullanıcı hayal edin. `backgroundFetch.fetch()`'e bir URL dizisi geçirebilirsiniz. Bu, tarayıcı tarafından tek bir atomik iş olarak ele alınır, tüm paket için tek bir bildirim ve tek bir ilerleme çubuğu ile. `backgroundfetchsuccess` işleyicinizde, `bgFetch.matchAll()` daha sonra ayrı ayrı işleyebileceğiniz bir kayıt dizisi döndürecektir.
Hata Yönetimi ve Başarısızlık Senaryoları
Bir indirme birçok nedenden dolayı başarısız olabilir: sunucu 404 hatası döndürür, kullanıcının disk alanı tükenir veya kullanıcı indirmeyi tarayıcının kullanıcı arayüzünden manuel olarak iptal eder. `backgroundfetchfail` olay işleyiciniz sizin güvenlik ağınızdır. Kısmi verileri temizlemek, uygulama içinde kullanıcıyı bilgilendirmek ve belki bir yeniden deneme düğmesi sunmak için kullanabilirsiniz. Başarısızlığın bir olasılık olduğunu anlamak, sağlam bir sistem kurmanın anahtarıdır.
İndirilen Varlıkları Cache API ile Depolama
İndirilen web varlıklarını depolamak için en yaygın ve etkili yer Cache API'dir. Özellikle `Request` ve `Response` nesneleri için tasarlanmış bir depolama mekanizmasıdır. İndirilen dosyalarınızı önbelleğe yerleştirerek, kullanıcı bunlara erişmeye çalıştığında daha sonra bunları doğrudan Service Worker'dan sunabilir ve uygulamanızı gerçekten çevrimdışı yetenekli hale getirebilirsiniz.
Farklı Sektörlerdeki Kullanım Alanları
Background Fetch'in uygulamaları çok geniştir ve çok sayıda küresel sektörü kapsar:
- Medya ve Eğlence: Web tabanlı yayın hizmetleri, çevrimdışı bir mod sunarak her ülkedeki kullanıcıların, tıpkı yerel uygulama benzerleri gibi, uçuşlar veya işe gidiş gelişler için film veya müzik indirmelerine olanak tanıyabilir.
- Eğitim ve E-Öğrenme: Afrika'daki bir üniversite, öğrencilerin büyük video dersleri ve etkileşimli ders materyallerini indirmeleri için bir web portalı sağlayabilir, böylece ev interneti zayıf olanların bile eğitimlerine erişebilmelerini sağlar.
- Kurumsal ve Saha Hizmetleri: Küresel bir imalat şirketi, saha mühendislerini, internet erişimi olmayan uzak bir sahaya gitmeden önce devasa 3D şemaları ve makineler için teknik kılavuzları indirmelerine olanak tanıyan bir PWA ile donatabilir.
- Seyahat ve Turizm: Bir seyahat uygulaması, kullanıcıların hedefleri için çevrimdışı haritalar, şehir rehberleri ve bilet bilgilerini indirmelerine olanak tanıyarak onları pahalı uluslararası veri dolaşım ücretlerinden kurtarabilir.
Tarayıcı Uyumluluğu ve Geleceğe Bakış
Bu yazının yazıldığı tarih itibarıyla, Background Fetch API temel olarak Google Chrome ve Microsoft Edge gibi Chromium tabanlı tarayıcılarda desteklenmektedir. En son uyumluluk bilgileri için CanIUse.com veya MDN Web Docs gibi kaynakları kontrol etmek önemlidir. Henüz evrensel olarak benimsenmemiş olsa da, büyük tarayıcılardaki varlığı önemli bir ilerlemeye işaret etmektedir. Web platformu gelişmeye devam ettikçe, bunun gibi API'ler web ve yerel uygulamalar arasındaki yetenek farkını kapatarak yeni nesil güçlü, dayanıklı ve küresel olarak erişilebilir PWA'ların yolunu açmaktadır.
Sonuç: Herkes İçin Daha Dayanıklı Bir Web İnşa Etmek
Background Fetch API, dosya indirmek için bir araçtan daha fazlasıdır. İnşa etmek istediğimiz web türü hakkında bir ifadedir: dayanıklı, kullanıcı merkezli ve cihazı veya ağ bağlantısının kalitesi ne olursa olsun herkes için çalışan bir web. Büyük aktarımları tarayıcıya devrederek, kullanıcılarımızı bir ilerleme çubuğunu izleme endişesinden kurtarır, verilerini ve pillerini korur ve sağlam ve güvenilir bir deneyim sunarız.
Büyük dosya transferleri içeren bir sonraki web projenizi planlarken, geleneksel `fetch`'in ötesine bakın. Kullanıcılarınızın küresel bağlamını göz önünde bulundurun ve gerçekten modern, çevrimdışı öncelikli bir uygulama oluşturmak için Background Fetch'in gücünü benimseyin. Web'in geleceği kalıcı ve dayanıklıdır ve artık indirmeleriniz de öyle olabilir.